Read Buf

Read Buf

在 FreeBSD 上使用 Wireguard 和 VXLAN 实现跨 VPS 的网络桥接

在当今互联的世界中,系统管理员经常需要在多个虚拟专用服务器(VPS)上管理服务。本文介绍了一种高级网络设置,使用 Wireguard 和 VXLAN 在 FreeBSD 系统上连接两个 VPS 实例的网络。当需要在不同提供商之间分配服务或利用多个托管环境的优势时,这种配置特别有用。

背 景

BSD Cafe,我们使用各种 VPS 实例来提供服务。主要有两个:

  1. 一个公开可访问的 VPS,负责运行反向代理和所有包路由的防火墙规则。
  2. 一个托管在我自己物理主机上的较大 VPS,它不直接暴露于互联网,也没有公共 IP 地址。

大多数 BSD Cafe 服务的 jails 分布在这两个 VPS 实例之间。有时,我需要在它们之间迁移服务,以便提高性能或更有效地管理更新。

为了实现这种灵活性,我一直在每个 VPS 上配置一个网桥。最初,我使用 Zerotier 来连接这些网桥,使它们能够像一个大型网络一样通信。

新设置:Wireguard 和 VXLAN

尽管 Zerotier 的方案有效,但我决定改用 Wireguard 和 VXLAN,这种方案更精简,原因如下:

  1. 性能:Wireguard 性能优异,开销低。
  2. 简洁性:配置简单,易于维护。
  3. 安全性:Wireguard 提供强大、现代的加密技术。

最初,我就已经在两个服务器之间建立了 Wireguard 连接。因只有一个服务器是公开访问的,我将它设置为只接受连接,另一个服务器则直接连接到该服务器的公共 IP,并设置了 20 秒的 keepalive(由于两个服务器之间的高流量,一般无需 keepalive)。

为了完成这个设置,我在各 VPS 上添加了两个 VXLAN 接口,并将这些接口添加到本地网桥中,包即时在网络间开始传输。

整体网络拓扑

pic

步骤实施

请按照以下步骤,在 FreeBSD 上使用 Wireguard 和 VXLAN 连接两个不同的网络。虽然我在 BSD Cafe 用这个设置来连接 jails,但你可以用它来实现很多用途,比如在不同提供商之间连接各种 VM(bhyve)实例。

必要条件

Wireguard 现在已经集成在 FreeBSD 中,所以你不再需要自己编译模块或使用 Go 版本。然而,我们将使用 “wireguard-tools” 脚本,因为它们提供了非常实用的 “wg-quick” 命令。

首先在两台服务器上安装 wireguard-tools 软件包:

pkg install wireguard-tools

配置指南

Server 1 (公网 IP)

  1. 生成 Wireguard 的密钥对:
wg genkey | tee /dev/stderr | wg pubkey | grep --label PUBLIC -H .

这条命令会生成一对私钥和公钥。请记下公钥,因为配置客户端时会用到它。

我们再添加一个 PSK(预共享密钥);虽然是可选的,但添加后可以提升整个系统的安全性。

wg genpsk
  1. 创建一个名为 /usr/local/etc/wireguard/wg0.conf 的新文件:
[Interface]
## Default port is 51820 - feel free to change it
PrivateKey = <the private key from the previous command>
ListenPort = 43671
Address = 10.77.0.1/24

PostUp = /sbin/ifconfig vxlan create vxlanid 42 vxlanlocal 10.77.0.1 vxlanremote 10.77.0.2 inet 10.77.1.1/24
PostUp = /sbin/ifconfig bridge0 addm vxlan0 up
PostDown = /sbin/ifconfig vxlan0 destroy

[Peer]
PublicKey = <the other peer's public key>
AllowedIPs = 10.77.0.2/32
PresharedKey = <the PSK from the previous command>
  1. 修改 /etc/rc.conf 并添加:
wireguard_interfaces="wg0"
wireguard_enable="YES"
  1. 启动 Wireguard 和 VXLAN 端点:
wg-quick up wg0

Server 2 (NAT 背后)

  1. 像之前一样生成 Wireguard 密钥。
  2. 创建配置文件 /usr/local/etc/wireguard/wg0.conf
[Interface]
PrivateKey = <the private key from the previous command>
Address = 10.77.0.2/24

PostUp = /sbin/ifconfig vxlan create vxlanid 42 vxlanlocal 10.77.0.2 vxlanremote 10.77.0.1 inet 10.77.1.2/24
PostUp = /sbin/ifconfig bridge0 addm vxlan0 up
PostDown = /sbin/ifconfig vxlan0 destroy

[Peer]
PublicKey = <the other peer's public key>
AllowedIPs = 10.77.0.1/32
PresharedKey = <the PSK from the previous command>
Endpoint = <public_ip>:<port>
PersistentKeepalive = 20
  1. 按之前的说明修改 /etc/rc.conf 文件。
  2. 启动 Wireguard 和 VXLAN 端点:
wg-quick up wg0

验证连接

要检查连接是否建立,可以在任一主机上运行 wg 命令。此命令会显示连接状态、最近一次握手时间,以及数据传输情况。

你还可以尝试 ping 另一个主机的 Wireguard 和 VXLan 接口 IP 地址(例如 10.77.0.1、10.77.0.2,或 10.77.1.1、10.77.1.2)。

VXLAN 配置细节

pic

总 结

这种设置允许将两个 VXLAN 接口插入本地桥,通过 Wireguard 实现数据包的转发。这可以在两个主机之间畅通无阻地传递数据,实际上在你的 VPS 实例之间创建了一个统一的网络。

这种配置特别适用于:

  • 将服务分散在不同的服务提供商上
  • 同时利用公共和私有的 VPS 实例
  • 创建灵活且可扩展的网络架构

使用 Wireguard 和 VXLAN,可以享受到强大的加密、高效的性能,并能在物理分离的服务器之间创建复杂的网络拓扑。

请记住,始终保持系统更新,并定期检查网络配置,以确保其符合不断变化的需求和安全要求。